﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////


#pragma once

#include "GcmpModelInterface.h"
#include "Color.h"
#include "GbmpQuickCast.h"

namespace gcmp
{
    class IGraphicsNodeReference;

    /// \brief 曲率云图显示模式
    enum class CurvatureGraphDisplayMode : int8_t
    {
        Gaussian = 0,                            ///< 高斯曲率模式
        SquareRootGaussian = 1,                  ///< 平方根高斯曲率模式
        Maximum = 2,                             ///< 最大曲率模式
        Minimum = 3,                             ///< 最小曲率模式
        Mean = 4,                                ///< 平均曲率模式
        FabsMaxCurvature = 5,                    ///< 曲率的绝对值的最大值模式
        FabsMinCurvature = 6,                    ///< 曲率的绝对值的最小值模式
    };

    /// \brief 曲率值类型,当曲率云图显示的类型为最大曲率、最小曲率、平均曲率时，数值类型可以在曲率和曲率半径之间切换
    enum class CurvatureValueType : int8_t
    {
        Curvature = 0,                          ///< 曲率值类型
        CurvatureRadius = 1                     ///< 曲率半径类型
    };

    /// \brief 曲率颜色段， 左闭右开【Min, Max)
    struct GCMP_MODEL_INTERFACE_EXPORT CurvatureColorInterval
    {
        double Min = 0.0;                             ///< 曲率段最小值
        double Max = 0.0;                             ///< 曲率段最大值
        Color CurvatureColor;                         ///< 曲率段对应颜色

        /// \brief 曲率颜色段前者是否小于后者
        ///
        /// \param another 对比对象
        bool operator < (const CurvatureColorInterval& other) const;

        /// \brief 曲率颜色段是否相等
        ///
        /// \param another 对比对象
        bool operator == (const CurvatureColorInterval &other) const;

        /// \brief 曲率颜色段是否不等
        ///
        /// \param another 对比对象
        bool operator != (const CurvatureColorInterval &other) const;
    }; 

    /// \brief 曲率云图参数
    struct GCMP_MODEL_INTERFACE_EXPORT CurvatureGraphOptions
    {
        CurvatureGraphDisplayMode GraphType = CurvatureGraphDisplayMode::Gaussian;  ///< 设置曲率云图的显示类型
        CurvatureValueType ValueType = CurvatureValueType::Curvature;               ///< 数值类型
        std::vector<CurvatureColorInterval> ColorIntervalVec;                       ///< 色标中曲率段对应的颜色值, 必须从小到大且连续的，【0，100），【100，100）
                                                                                    ///< 添加后可以进行排序

        /// \brief 曲率云图参数是否有效
        /// 其中ColorIntervalVec值必须是连续的，如【0，100），【100，1000）
        bool IsValid() const;

        /// \brief 曲率颜色段前者是否小于后者
        ///
        /// \param another 对比对象
        bool operator < (const CurvatureGraphOptions& other) const;

        /// \brief 曲率颜色段是否相等
        ///
        /// \param another 对比对象
        bool operator == (const CurvatureGraphOptions &other) const;

        /// \brief 曲率颜色段是否不等
        ///
        /// \param another 对比对象
        bool operator != (const CurvatureGraphOptions &other) const;
    };

    /// \brief 曲率云图效果管理器
    class GCMP_MODEL_INTERFACE_EXPORT ICurvatureGraphManager
    {
        DEFINE_CAST_BASE(gcmp::ICurvatureGraphManager);
    public:
        /// \brief 析构函数
        virtual ~ICurvatureGraphManager();

        /// \brief 开启或关闭曲率云图效果
        ///
        /// \param isToShow 是否开启
        virtual void ShowCurvatureGraph(bool isToShow) = 0;

        /// \brief 曲率云图是否开启
        virtual bool IsCurvatureGraphShowing() const = 0;

        /// \brief 设置需要展示曲率云图的面以及参数
        ///
        /// \param face 需要设置的面
        /// \param option 该面对应的曲率云图参数
        /// \return 设置是否成功
        virtual bool ShowFaceCurvatureGraph(const IGraphicsNodeReference& face, const CurvatureGraphOptions& option) = 0;

        /// \brief 获取对应面参数
        ///
        /// \param face 需要获取参数的面
        /// \param option 为输出参数，该面对应的参数值
        /// \return 是否成功
        virtual bool GetCurvatureGraphOption(const IGraphicsNodeReference& face, CurvatureGraphOptions& option) const = 0;

        /// \brief 取消面显示曲率云图
        ///
        /// \param face 需要取消的面
        /// \return 取消是否成功
        virtual bool CancelShowFaceCurvatureGraph(const IGraphicsNodeReference &face) = 0;

        /// \brief 查询面是否显示曲率云图
        ///
        /// \param face 需要查询的面
        /// \return true 显示， false 没有显示
        virtual bool IsShowFaceCurvatureGraph(const IGraphicsNodeReference &face) const = 0;
    };
}
